package com.acme.faturamento.model.entity;

import java.io.Serializable;
import java.math.BigDecimal;
import java.sql.Date;
import java.util.Collection;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.TableGenerator;
import javax.persistence.Transient;

/**
 * @author Reinaldo
 *
 */
@Entity
@Table(name = "nota_fiscal")
@SequenceGenerator(name = "nf_sequence", sequenceName = "nf_id_seq")
@TableGenerator(name = "nf_id", table = "chaves_primarias", pkColumnName = "chave", pkColumnValue = "nota_fiscal", valueColumnName = "valor")
public class NotaFiscal implements Serializable {
    private Long id;
    private Long numero;
    private String serie;
    private Cliente cliente;
    private NaturezaOperacao naturezaOperacao;
    private Date dataEmissao;
    private Date dataSaida;
    private Date dataGravacao;
    private String condPagto;
    private String volume;
    private Double pesoEmbalagem;
    private Collection<MensagemFiscal> mensagensFiscais;
    private Collection<ItemNotaFiscal> itens;

    @Transient
    public void addMensagemFiscal(MensagemFiscal mensagemFiscal) {
        if (!mensagensFiscais.contains(mensagemFiscal)) {
            mensagensFiscais.add(mensagemFiscal);
        }
    }
    @Transient
    public void removeMensagemFiscal(MensagemFiscal mensagemFiscal) {
        if (mensagensFiscais.contains(mensagemFiscal)) {
            mensagensFiscais.remove(mensagemFiscal);
        }
    }
    @Transient
    public void addItem(ItemNotaFiscal item) {
        if (!itens.contains(item)) {
            itens.add(item);
        }
    }

    @Transient
    public void removeItem(ItemNotaFiscal item) {
        if (itens.contains(item)) {
            itens.remove(item);
        }
    }

    @ManyToOne
    public Cliente getCliente() {
        return cliente;
    }

    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

    public String getCondPagto() {
        return condPagto;
    }

    public void setCondPagto(String condPagto) {
        this.condPagto = condPagto;
    }

    public Date getDataEmissao() {
        return dataEmissao;
    }

    public void setDataEmissao(Date dataEmissao) {
        this.dataEmissao = dataEmissao;
    }

    public Date getDataGravacao() {
        return dataGravacao;
    }

    public void setDataGravacao(Date dataGravacao) {
        this.dataGravacao = dataGravacao;
    }

    public Date getDataSaida() {
        return dataSaida;
    }

    public void setDataSaida(Date dataSaida) {
        this.dataSaida = dataSaida;
    }

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "nf_sequence")
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @OneToMany(cascade = { CascadeType.ALL })
    @JoinColumn(name = "NF_ID")
    public Collection<ItemNotaFiscal> getItens() {
        return itens;
    }

    public void setItens(Collection<ItemNotaFiscal> itens) {
        this.itens = itens;
    }

    @ManyToMany
    @JoinTable(name = "NFISCAL_MENSFISCAL", joinColumns = { @JoinColumn(name = "NF_ID") }, inverseJoinColumns = { @JoinColumn(name = "MENFISCAL_ID") })
    public Collection<MensagemFiscal> getMensagensFiscais() {
        return mensagensFiscais;
    }

    public void setMensagensFiscais(Collection<MensagemFiscal> mensagensFiscais) {
        this.mensagensFiscais = mensagensFiscais;
    }

    @ManyToOne
    public NaturezaOperacao getNaturezaOperacao() {
        return naturezaOperacao;
    }

    public void setNaturezaOperacao(NaturezaOperacao naturezaOperacao) {
        this.naturezaOperacao = naturezaOperacao;
    }

    public Long getNumero() {
        return numero;
    }

    public void setNumero(Long numero) {
        this.numero = numero;
    }

    public Double getPesoEmbalagem() {
        return pesoEmbalagem;
    }

    public void setPesoEmbalagem(Double pesoEmbalagem) {
        this.pesoEmbalagem = pesoEmbalagem;
    }

    public String getSerie() {
        return serie;
    }

    public void setSerie(String serie) {
        this.serie = serie;
    }

    public String getVolume() {
        return volume;
    }

    public void setVolume(String volume) {
        this.volume = volume;
    }

    @Transient
    public Double getPesoBruto() {
        return Double.valueOf("0.00");
    }

    @Transient
    public Double getPesoLiquido() {
        return Double.valueOf("0.00");
    }

    @Transient
    public BigDecimal getTotalProdutos() {
        return new BigDecimal("0.00");
    }

    @Transient
    public BigDecimal getTotalNotaFiscal() {
        return new BigDecimal("0.00");
    }

    @Transient
    public BigDecimal getIcms() {
        return new BigDecimal("0.00");
    }

    @Transient
    public BigDecimal getIss() {
        return null;
    }
}
